package com.me.config;

import com.me.service.CustomUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@EnableWebSecurity // 用来开启SpringSecurity的注解
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/","index").permitAll()    // permitAll() 这个代表谁都可以访问
                .antMatchers("/mail/**").hasAnyRole("mail");// hasAnyRole() 这个代表要有指定的角色才可以访问的,比如有mail这个角色

        // 这一块是用于自定义的登录页面
        http.formLogin()
                .usernameParameter("username")  // 里面的username必须和前端表单传递的name要一致
                .passwordParameter("password")	// 里面的password必须和前端表单传递的name要一致
                .loginPage("/toLogin")			// 设置登录页面的地址
                .loginProcessingUrl("/login");	// 登录页面表单提交的地址
        http.csrf().disable();					// 禁用csrf
        http.logout().logoutSuccessUrl("/");	// 设置当注销用户时跳转的页面
        http.rememberMe().rememberMeParameter("remeber");	// 设置当前用户是否记住我默认保留14天
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        // 我使用的是通过在代码中硬性设置账号和密码来实现的,如果要通过数据库的来实现账号和密码验证的话可以在网上找找资料！
        // passwordEncoder()密码加密方式,我这里用到的是 new BCryptPasswordEncoder()加密

        auth.userDetailsService(customUserDetailsService)
                .passwordEncoder(new BCryptPasswordEncoder());
        /*auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("me").password(new BCryptPasswordEncoder().encode("123456")).roles("mail")
                .and()
                .withUser("admin").password(new BCryptPasswordEncoder().encode("123456")).roles("mail");*/
    }

}
